# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements; and to You under the Apache License, Version 2.0.

whisk.spi {
  SimpleSpi = whisk.spi.SimpleSpiImpl
  MissingSpi = whisk.spi.MissingImpl
  MissingModule = missing.module
}
