summaryrefslogtreecommitdiffstats
path: root/src/main/scala/myapp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/myapp')
-rw-r--r--src/main/scala/myapp/application.scala13
-rw-r--r--src/main/scala/myapp/cake/container.scala48
-rw-r--r--src/main/scala/myapp/cake/services.scala30
-rw-r--r--src/main/scala/myapp/database.scala19
-rw-r--r--src/main/scala/myapp/logger.scala10
5 files changed, 120 insertions, 0 deletions
diff --git a/src/main/scala/myapp/application.scala b/src/main/scala/myapp/application.scala
new file mode 100644
index 0000000..24cda2a
--- /dev/null
+++ b/src/main/scala/myapp/application.scala
@@ -0,0 +1,13 @@
+package myapp.application
+
+import myapp.logger.Logger
+import myapp.database.Database
+
+class MyApp (logger: Logger, dbh: Database) {
+ def run {
+ logger.log("starting")
+ logger.log("got a dbh: " + dbh)
+ logger.log(dbh.query("foo"))
+ logger.log("ending")
+ }
+}
diff --git a/src/main/scala/myapp/cake/container.scala b/src/main/scala/myapp/cake/container.scala
new file mode 100644
index 0000000..7c40880
--- /dev/null
+++ b/src/main/scala/myapp/cake/container.scala
@@ -0,0 +1,48 @@
+package myapp.cake.container
+
+import myapp.cake.services
+import myapp.logger.FileLogger
+import myapp.database.DBI
+import myapp.application.MyApp
+
+trait HasLogger extends services.HasLogger {
+ type LoggerType = Logger
+
+ class Logger(
+ logFileName: String
+ ) extends FileLogger(logFileName) with LoggerService
+}
+
+trait HasDatabase extends services.HasDatabase {
+ type DatabaseType = Database
+
+ class Database protected (
+ dsn: String,
+ username: String,
+ password: String
+ ) extends DBI(dsn, username, password) with DatabaseService
+
+ object Database {
+ def connect(dsn: String, username: String, password: String) =
+ new Database(dsn, username, password)
+ }
+}
+
+trait HasApplication extends services.HasApplication {
+ this: HasLogger with HasDatabase =>
+
+ type ApplicationType = Application
+
+ class Application extends MyApp(logger, database) with ApplicationService
+}
+
+class Container (
+ logFileName: String = "out.log",
+ dsn: String = "dbi:mysql:myapp",
+ username: String = "doy",
+ password: String = "blah"
+) extends HasApplication with HasLogger with HasDatabase {
+ lazy val application = new Application
+ lazy val logger = new Logger(logFileName)
+ lazy val database = Database.connect(dsn, username, password)
+}
diff --git a/src/main/scala/myapp/cake/services.scala b/src/main/scala/myapp/cake/services.scala
new file mode 100644
index 0000000..99be3d5
--- /dev/null
+++ b/src/main/scala/myapp/cake/services.scala
@@ -0,0 +1,30 @@
+package myapp.cake.services
+
+import myapp.database.Database
+import myapp.logger.Logger
+
+trait HasApplication {
+ type ApplicationType
+
+ val application: ApplicationType with ApplicationService
+
+ trait ApplicationService {
+ def run (): Unit
+ }
+}
+
+trait HasDatabase {
+ type DatabaseType
+
+ val database: DatabaseType with DatabaseService
+
+ trait DatabaseService extends Database
+}
+
+trait HasLogger {
+ type LoggerType
+
+ val logger: LoggerType with LoggerService
+
+ trait LoggerService extends Logger
+}
diff --git a/src/main/scala/myapp/database.scala b/src/main/scala/myapp/database.scala
new file mode 100644
index 0000000..9a321c2
--- /dev/null
+++ b/src/main/scala/myapp/database.scala
@@ -0,0 +1,19 @@
+package myapp.database
+
+trait Database {
+ def query (search: String): String
+}
+
+class DBI protected (
+ dsn: String,
+ username: String,
+ password: String
+) extends Database {
+ def query (search: String): String = "found " + search
+ override def toString = List(dsn, username, password).mkString(", ")
+}
+
+object DBI {
+ def connect (dsn: String, username: String, password: String) =
+ new DBI(dsn, username, password)
+}
diff --git a/src/main/scala/myapp/logger.scala b/src/main/scala/myapp/logger.scala
new file mode 100644
index 0000000..8e985dc
--- /dev/null
+++ b/src/main/scala/myapp/logger.scala
@@ -0,0 +1,10 @@
+package myapp.logger
+
+trait Logger {
+ def log (msg: String): Unit
+}
+
+class FileLogger (logFileName: String) extends Logger {
+ def log (msg: String): Unit =
+ println("writing " + msg + " to " + logFileName)
+}