Commit bfa369b

mo khan <mo@mokhan.ca>
2010-02-06 07:46:26
got the first dialog popping up to add new family members.
1 parent 1377265
Changed files (102)
build
product
client
boot
database
domain
presentation
presentation.windows
presentation.winforms
service
service.contracts
service.infrastructure
commons
tests
build/project.build
@@ -11,7 +11,8 @@
 	<property name="build.config.dir" value="${build.dir}\config" />
 	<property name="build.compile.dir" value="${build.dir}\compile" />
 	
-	<property name="app.output" value="${project.name}.exe" />
+	<!--<property name="app.output" value="${project.name}.exe" />-->
+	<property name="app.output" value="${project.name}.wpf.exe" />
 	
 	<include buildfile="project.test.build" />
 	<include buildfile="project.deploy.build" />
@@ -29,7 +30,7 @@
 	<target name="app.compile" depends="init">
     <exec program="C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
           workingdir="${base.dir}"
-          commandline="solution.sln /p:Configuration=Release;OutDir=${build.compile.dir}\ /t:Rebuild /nologo"
+          commandline="solution.sln /p:Configuration=Release;OutDir=${build.compile.dir}\ /t:Rebuild /nologo /m"
           />
 	</target>
 
product/client/boot/boot/container/registration/proxy_configuration/UnitOfWorkInterceptor.cs
@@ -23,7 +23,7 @@ namespace MoMoney.boot.container.registration.proxy_configuration
             using (var unit_of_work = factory.create())
             {
                 invocation.Proceed();
-                broker.publish<Callback<IUnitOfWork>>(x => x.run(unit_of_work));
+                broker.publish<Callback<IUnitOfWork>>(x => x.run_against(unit_of_work));
                 unit_of_work.commit();
             }
         }
product/client/boot/boot/container/registration/AutoWireComponentsInToThe.cs
@@ -21,7 +21,7 @@ namespace MoMoney.boot.container.registration
             this.exclusion_policy = exclusion_policy;
         }
 
-        public void run(Assembly item)
+        public void run_against(Assembly item)
         {
             item
                 .all_types(exclusion_policy.not())
product/client/boot/boot/container/registration/IContainerStartup.cs
@@ -1,7 +1,7 @@
 using gorilla.commons.infrastructure.thirdparty;
-using gorilla.commons.utility;
-
+using gorilla.commons.utility;
+
 namespace MoMoney.boot.container.registration
 {
-    public interface IContainerStartup : ParameterizedCommand<DependencyRegistration> { }
+    public interface IContainerStartup : ArgCommand<DependencyRegistration> { }
 }
\ No newline at end of file
product/client/boot/boot/container/registration/IStartupCommand.cs
@@ -3,5 +3,5 @@ using gorilla.commons.utility;
 
 namespace MoMoney.boot.container.registration
 {
-    public interface IStartupCommand : ParameterizedCommand<Assembly> {}
+    public interface IStartupCommand : ArgCommand<Assembly> {}
 }
\ No newline at end of file
product/client/boot/boot/container/registration/WireUpTheDataAccessComponentsIntoThe.cs
@@ -21,7 +21,7 @@ namespace MoMoney.boot.container.registration
             register = registry;
         }
 
-        public void run(Assembly item)
+        public void run_against(Assembly item)
         {
             register.singleton<IDatabase, ObjectDatabase>();
             register.singleton(() => Resolve.the<IDatabase>().downcast_to<IDatabaseConfiguration>());
product/client/boot/boot/container/registration/WireUpTheDomainServicesInToThe.cs
@@ -13,7 +13,7 @@ namespace MoMoney.boot.container.registration
             this.registry = registry;
         }
 
-        public void run(Assembly item)
+        public void run_against(Assembly item)
         {
             registry.transient<ICompanyFactory, CompanyFactory>();
         }
product/client/boot/boot/container/registration/WireUpTheEssentialServicesIntoThe.cs
@@ -14,7 +14,7 @@ namespace MoMoney.boot.container.registration
             this.registration = registration;
         }
 
-        public void run(Assembly item)
+        public void run_against(Assembly item)
         {
             registration.singleton(() => registration);
             registration.singleton(() => registration.build());
product/client/boot/boot/container/registration/WireUpTheInfrastructureInToThe.cs
@@ -24,7 +24,7 @@ namespace MoMoney.boot.container.registration
             this.registry = registry;
         }
 
-        public void run(Assembly item)
+        public void run_against(Assembly item)
         {
             registry.singleton<EventAggregator, SynchronizedEventAggregator>();
             registry.singleton<ITimer, IntervalTimer>();
product/client/boot/boot/container/registration/WireUpTheMappersInToThe.cs
@@ -16,7 +16,7 @@ namespace MoMoney.boot.container.registration
             this.registry = registry;
         }
 
-        public void run(Assembly item)
+        public void run_against(Assembly item)
         {
             registry.transient(typeof (Mapper<,>), typeof (AnonymousMapper<,>));
             //registry.singleton(()=> Mappers.bill_mapper);
product/client/boot/boot/container/registration/WireUpThePresentationModules.cs
@@ -26,7 +26,7 @@ namespace MoMoney.boot.container.registration
             this.registry = registry;
         }
 
-        public void run(Assembly item)
+        public void run_against(Assembly item)
         {
             Func<IApplicationController> target = () => new ApplicationController(Lazy.load<Shell>(), Lazy.load<PresenterFactory>(), Lazy.load<EventAggregator>(), Lazy.load<ViewFactory>());
             registry.proxy<IApplicationController, SynchronizedConfiguration<IApplicationController>>(target.memorize());
product/client/boot/boot/container/registration/WireUpTheReportsInToThe.cs
@@ -19,7 +19,7 @@ namespace MoMoney.boot.container.registration
             this.registry = registry;
         }
 
-        public void run(Assembly item)
+        public void run_against(Assembly item)
         {
             registry.singleton<IReportViewer, ReportViewer>();
             registry.transient(typeof (Presenter), typeof (ReportPresenter<IViewAllBillsReport, IEnumerable<BillInformationDTO>, IGetAllBillsQuery>));
product/client/boot/boot/container/registration/WireUpTheServicesInToThe.cs
@@ -51,7 +51,7 @@ namespace MoMoney.boot.container.registration
                                         Lazy.load<IIncomeRepository>(), Lazy.load<ICompanyRepository>()));
         }
 
-        public void run(Assembly item)
+        public void run_against(Assembly item)
         {
             wire_up_queries();
             wire_up_the_commands();
product/client/boot/boot/container/registration/WireUpTheViewsInToThe.cs
@@ -17,7 +17,7 @@ namespace MoMoney.boot.container.registration
             register = registry;
         }
 
-        public void run(Assembly item)
+        public void run_against(Assembly item)
         {
             var shell = new ApplicationShell();
             register.singleton<Shell>(() => shell);
product/client/boot/boot/container/WireUpTheContainer.cs
@@ -29,7 +29,7 @@ namespace MoMoney.boot.container
                 .then(new WireUpThePresentationModules(registry))
                 .then(new WireUpTheViewsInToThe(registry))
                 .then(new WireUpTheReportsInToThe(registry))
-                .run(new ApplicationAssembly(
+                .run_against(new ApplicationAssembly(
                          System.Reflection.Assembly.GetExecutingAssembly(),
                          typeof (DatabaseAssembly).Assembly,
                          typeof (PresentationAssembly).Assembly,
product/client/database/transactions/DatabaseCommand.cs
@@ -1,8 +1,6 @@
-using gorilla.commons.utility;
-
-namespace momoney.database.transactions
-{
-    public interface DatabaseCommand : ParameterizedCommand<DatabaseConnection>
-    {
-    }
+using gorilla.commons.utility;
+
+namespace momoney.database.transactions
+{
+    public interface DatabaseCommand : ArgCommand<DatabaseConnection> {}
 }
\ No newline at end of file
product/client/database/transactions/DeleteFromDatabase.cs
@@ -9,7 +9,7 @@ namespace momoney.database.transactions
             this.entity = entity;
         }
 
-        public void run(DatabaseConnection connection)
+        public void run_against(DatabaseConnection connection)
         {
             connection.delete(entity);
         }
product/client/database/transactions/SaveOrUpdateFromDatabase.cs
@@ -12,7 +12,7 @@ namespace momoney.database.transactions
             this.entity = entity;
         }
 
-        public void run(DatabaseConnection connection)
+        public void run_against(DatabaseConnection connection)
         {
             connection.store(entity);
         }
product/client/database/database.csproj
@@ -39,10 +39,6 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\build\lib\app\gorilla\gorilla.commons.infrastructure.dll</HintPath>
     </Reference>
-    <Reference Include="gorilla.commons.utility, Version=2009.5.5.1633, Culture=neutral, PublicKeyToken=687787ccb6c36c9f, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\build\lib\app\gorilla\gorilla.commons.utility.dll</HintPath>
-    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
product/client/database/ObjectDatabase.cs
@@ -32,7 +32,7 @@ namespace momoney.database
         {
             using (var connection = factory.open_connection_to(path_to_database()))
             {
-                command.run(connection);
+                command.run_against(connection);
                 connection.commit();
             }
         }
product/client/domain/Domain.csproj
@@ -31,10 +31,6 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="gorilla.commons.utility, Version=2009.5.5.1633, Culture=neutral, PublicKeyToken=687787ccb6c36c9f, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\build\lib\app\gorilla\gorilla.commons.utility.dll</HintPath>
-    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
product/client/presentation/Model/Menu/File/CloseProjectCommand.cs
@@ -22,7 +22,7 @@ namespace momoney.presentation.model.menu.file
 
         public void run()
         {
-            command.run(this);
+            command.run_against(this);
         }
 
         public void saved()
product/client/presentation/Model/Menu/File/ExitCommand.cs
@@ -25,7 +25,7 @@ namespace momoney.presentation.model.menu.file
 
         public void run()
         {
-            command.run(this);
+            command.run_against(this);
         }
 
         public void saved()
product/client/presentation/Model/Menu/File/ISaveChangesCommand.cs
@@ -1,6 +1,6 @@
-using gorilla.commons.utility;
-
+using gorilla.commons.utility;
+
 namespace MoMoney.Presentation.Model.Menu.File
 {
-    public interface ISaveChangesCommand : ParameterizedCommand<ISaveChangesCallback> {}
+    public interface ISaveChangesCommand : ArgCommand<ISaveChangesCallback> {}
 }
\ No newline at end of file
product/client/presentation/Model/Menu/File/NewCommand.cs
@@ -21,7 +21,7 @@ namespace momoney.presentation.model.menu.file
 
         public void run()
         {
-            save_changes_command.run(this);
+            save_changes_command.run_against(this);
         }
 
         public void saved()
product/client/presentation/Model/Menu/File/OpenCommand.cs
@@ -24,7 +24,7 @@ namespace momoney.presentation.model.menu.file
 
         public void run()
         {
-            save_changes_command.run(this);
+            save_changes_command.run_against(this);
         }
 
         public void saved()
product/client/presentation/Model/Menu/File/SaveChangesPresenter.cs
@@ -28,7 +28,7 @@ namespace MoMoney.Presentation.Model.Menu.File
             throw new NotImplementedException();
         }
 
-        public virtual void run(ISaveChangesCallback item)
+        public virtual void run_against(ISaveChangesCallback item)
         {
             callback = item;
             if (current_project.has_unsaved_changes())
product/client/presentation/Model/Projects/ProjectController.cs
@@ -87,7 +87,7 @@ namespace MoMoney.Presentation.Model.Projects
             if (!has_been_saved_at_least_once()) throw new FileNotSpecifiedException();
         }
 
-        public void run(IUnitOfWork item)
+        public void run_against(IUnitOfWork item)
         {
             unsaved_changes = item.is_dirty();
             if (unsaved_changes)
product/client/presentation/Model/Reporting/IBindReportTo.cs
@@ -2,5 +2,5 @@ using gorilla.commons.utility;
 
 namespace MoMoney.Presentation.Model.reporting
 {
-    public interface IBindReportTo<T, TQuery> : IReport, ParameterizedCommand<T> where TQuery : Query<T> {}
+    public interface IBindReportTo<T, TQuery> : IReport, ArgCommand<T> where TQuery : Query<T> {}
 }
\ No newline at end of file
product/client/presentation/Presenters/CheckForUpdatesPresenter.cs
@@ -46,7 +46,7 @@ namespace momoney.presentation.presenters
             close();
         }
 
-        public void run(Percent completed)
+        public void run_against(Percent completed)
         {
             if (completed.Equals(new Percent(100)))
             {
product/client/presentation/Presenters/CommandPump.cs
@@ -1,6 +1,6 @@
 using Gorilla.Commons.Infrastructure.Container;
 using Gorilla.Commons.Infrastructure.Logging;
-using gorilla.commons.utility;
+using gorilla.commons.utility;
 using MoMoney.Service.Infrastructure.Threading;
 
 namespace MoMoney.Presentation.Presenters
@@ -8,7 +8,7 @@ namespace MoMoney.Presentation.Presenters
     public interface ICommandPump
     {
         ICommandPump run<Command>() where Command : gorilla.commons.utility.Command;
-        ICommandPump run<Command, T>(T input) where Command : ParameterizedCommand<T>;
+        ICommandPump run<Command, T>(T input) where Command : ArgCommand<T>;
         ICommandPump run<Output, Query>(Callback<Output> item) where Query : Query<Output>;
     }
 
@@ -36,12 +36,12 @@ namespace MoMoney.Presentation.Presenters
             return this;
         }
 
-        public ICommandPump run<Command, T>(T input) where Command : ParameterizedCommand<T>
+        public ICommandPump run<Command, T>(T input) where Command : ArgCommand<T>
         {
             var cached = input;
             var command = registry.get_a<Command>();
             this.log().debug("found: {0}", command);
-            processor.add(() => command.run(cached));
+            processor.add(() => command.run_against(cached));
             return this;
         }
 
product/client/presentation/Presenters/LogFilePresenter.cs
@@ -16,7 +16,7 @@ namespace momoney.presentation.presenters
         protected override void present()
         {
             view.display(tasks.get_the_path_to_the_log_file());
-            view.run(tasks.get_the_contents_of_the_log_file());
+            view.run_against(tasks.get_the_contents_of_the_log_file());
         }
     }
 }
\ No newline at end of file
product/client/presentation/Presenters/ProcessQueryCommand.cs
@@ -1,10 +1,10 @@
 using System;
-using gorilla.commons.utility;
+using gorilla.commons.utility;
 using momoney.service.infrastructure.threading;
 
 namespace MoMoney.Presentation.Presenters
 {
-    public interface IProcessQueryCommand<T> : ParameterizedCommand<Callback<T>> {}
+    public interface IProcessQueryCommand<T> : ArgCommand<Callback<T>> {}
 
     public class ProcessQueryCommand<T> : IProcessQueryCommand<T>
     {
@@ -17,10 +17,10 @@ namespace MoMoney.Presentation.Presenters
             this.factory = factory;
         }
 
-        public void run(Callback<T> callback)
+        public void run_against(Callback<T> callback)
         {
             var dto = query.fetch();
-            factory.create().run(new AnonymousCommand((Action) (() => callback.run(dto))));
+            factory.create().run_against(new AnonymousCommand((Action) (() => callback.run_against(dto))));
         }
     }
 }
\ No newline at end of file
product/client/presentation/Presenters/ReportPresenter.cs
@@ -20,7 +20,7 @@ namespace MoMoney.Presentation.Presenters
         protected override void present()
         {
             var report = registry.get_a<Report>();
-            report.run(registry.get_a<Query>().fetch());
+            report.run_against(registry.get_a<Query>().fetch());
             view.display(report);
         }
     }
product/client/presentation/Presenters/RunQueryCommand.cs
@@ -16,7 +16,7 @@ namespace momoney.presentation.presenters
 
         public void run()
         {
-            command.run(callback);
+            command.run_against(callback);
         }
     }
 }
\ No newline at end of file
product/client/presentation/Presentation.csproj
@@ -47,14 +47,6 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\build\lib\app\component.factory\ComponentFactory.Krypton.Toolkit.dll</HintPath>
     </Reference>
-    <Reference Include="gorilla.commons.infrastructure, Version=2009.5.5.1633, Culture=neutral, PublicKeyToken=687787ccb6c36c9f, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\build\lib\app\gorilla\gorilla.commons.infrastructure.dll</HintPath>
-    </Reference>
-    <Reference Include="gorilla.commons.utility, Version=2009.5.5.1633, Culture=neutral, PublicKeyToken=687787ccb6c36c9f, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\build\lib\app\gorilla\gorilla.commons.utility.dll</HintPath>
-    </Reference>
     <Reference Include="PresentationCore">
       <RequiredTargetFramework>3.0</RequiredTargetFramework>
     </Reference>
product/client/presentation.windows/commands/dto/FamilyMemberToAdd.cs
@@ -0,0 +1,13 @@
+using System;
+
+namespace presentation.windows.commands.dto
+{
+    public class FamilyMemberToAdd
+    {
+        public string first_name { get; set; }
+
+        public string last_name { get; set; }
+
+        public DateTime date_of_birth { get; set; }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/commands/AddMemberToFamily.cs
@@ -0,0 +1,14 @@
+using Gorilla.Commons.Infrastructure.Logging;
+using gorilla.commons.utility;
+using presentation.windows.commands.dto;
+
+namespace presentation.windows.commands
+{
+    public class AddMemberToFamily : ArgCommand<FamilyMemberToAdd>
+    {
+        public void run_against(FamilyMemberToAdd item)
+        {
+            this.log().debug("adding family member");
+        }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/commands/CommandBuilder.cs
@@ -0,0 +1,11 @@
+using gorilla.commons.utility;
+
+namespace presentation.windows.commands
+{
+    public interface CommandBuilder
+    {
+        ParameterizedCommandBuilder<TData> prepare<TData>(TData data);
+        Command build<TCommand>(string message) where TCommand : Command;
+    }
+
+}
\ No newline at end of file
product/client/presentation.windows/commands/ContainerAwareParameterizedCommandBuilder.cs
@@ -0,0 +1,38 @@
+using System;
+using Gorilla.Commons.Infrastructure.Container;
+using gorilla.commons.utility;
+
+namespace presentation.windows.commands
+{
+    public class ContainerAwareParameterizedCommandBuilder<T> : ParameterizedCommandBuilder<T>, Command
+    {
+        readonly T data;
+        Action action;
+        string message;
+        public ContainerAwareParameterizedCommandBuilder(T data)
+        {
+            this.data = data;
+        }
+
+        public Command build<TCommand>(string message) where TCommand : ArgCommand<T>
+        {
+            this.message = message;
+            action = () =>
+            {
+                Resolve.the<TCommand>().run_against(data);
+            };
+
+            return this;
+        }
+
+        public void run()
+        {
+            action();
+        }
+
+        public override string ToString()
+        {
+            return message;
+        }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/commands/ContainerCommandBuilder.cs
@@ -0,0 +1,18 @@
+using Gorilla.Commons.Infrastructure.Container;
+using gorilla.commons.utility;
+
+namespace presentation.windows.commands
+{
+    public class ContainerCommandBuilder : CommandBuilder
+    {
+        public ParameterizedCommandBuilder<T> prepare<T>(T data)
+        {
+            return new ContainerAwareParameterizedCommandBuilder<T>(data);
+        }
+
+        public Command build<T>(string message) where T : Command
+        {
+            return new NamedCommand<T>(message, Resolve.the<T>());
+        }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/commands/NamedCommand.cs
@@ -0,0 +1,26 @@
+using gorilla.commons.utility;
+
+namespace presentation.windows.commands
+{
+    public class NamedCommand<T> : Command where T : Command
+    {
+        readonly string message;
+        readonly T command;
+
+        public NamedCommand(string message, T command)
+        {
+            this.message = message;
+            this.command = command;
+        }
+
+        public void run()
+        {
+            command.run();
+        }
+
+        public override string ToString()
+        {
+            return message;
+        }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/commands/ParameterizedCommandBuilder.cs
@@ -0,0 +1,9 @@
+using gorilla.commons.utility;
+
+namespace presentation.windows.commands
+{
+    public interface ParameterizedCommandBuilder<T>
+    {
+        Command build<TCommand>(string message) where TCommand : ArgCommand<T>;
+    }
+}
\ No newline at end of file
product/client/presentation.windows/presenters/AddFamilyMemberPresenter.cs
@@ -0,0 +1,49 @@
+using System;
+using MoMoney.Service.Infrastructure.Threading;
+using presentation.windows.commands;
+using presentation.windows.commands.dto;
+using presentation.windows.views;
+
+namespace presentation.windows.presenters
+{
+    public class AddFamilyMemberPresenter : DialogPresenter
+    {
+        CommandBuilder command_builder;
+        CommandProcessor processor;
+
+        public AddFamilyMemberPresenter(CommandBuilder command_builder, CommandProcessor processor)
+        {
+            this.command_builder = command_builder;
+            this.processor = processor;
+        }
+
+        public void present()
+        {
+            Save = new SimpleCommand(() =>
+            {
+                processor.add(command_builder
+                                  .prepare(new FamilyMemberToAdd
+                                           {
+                                               first_name = first_name,
+                                               last_name = last_name,
+                                               date_of_birth = date_of_birth
+                                           })
+                                  .build<AddMemberToFamily>("Adding Family Member")
+                    );
+                close();
+            });
+            Cancel = new SimpleCommand(() =>
+            {
+                close();
+            });
+        }
+
+        public string first_name { get; set; }
+        public string last_name { get; set; }
+        public DateTime date_of_birth { get; set; }
+        public IObservableCommand Save { get; set; }
+        public IObservableCommand Cancel { get; set; }
+
+        public Action close { get; set; }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/presenters/IObservableCommand.cs
@@ -0,0 +1,9 @@
+using System.Windows.Input;
+
+namespace presentation.windows.presenters
+{
+    public interface IObservableCommand : ICommand
+    {
+        void notify_observers();
+    }
+}
\ No newline at end of file
product/client/presentation.windows/presenters/SimpleCommand.cs
@@ -0,0 +1,35 @@
+using System;
+
+namespace presentation.windows.presenters
+{
+    public class SimpleCommand : IObservableCommand
+    {
+        Action action = () => {};
+        Func<bool> predicate;
+
+        public SimpleCommand(Action action) : this(action, () => true) {}
+
+        public SimpleCommand(Action action, Func<bool> predicate)
+        {
+            this.action = action ?? (() => {});
+            this.predicate = predicate ?? (() => true);
+        }
+
+        public event EventHandler CanExecuteChanged = (o, e) => {};
+
+        public void Execute(object parameter)
+        {
+            action();
+        }
+
+        public bool CanExecute(object parameter)
+        {
+            return predicate();
+        }
+
+        public void notify_observers()
+        {
+            CanExecuteChanged(this, EventArgs.Empty);
+        }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/views/AddFamilyMemberDialog.xaml
@@ -0,0 +1,21 @@
+<Window x:Class="presentation.windows.views.AddFamilyMemberDialog"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" Title="Add A Family Member" ShowInTaskbar="False" WindowStartupLocation="CenterScreen">
+    <DockPanel>
+        <StackPanel>
+        <Label>Add A Family Member</Label>
+        <DockPanel>
+            <UniformGrid Rows="3">
+                <Label>first name</Label>
+                <TextBox Text="{Binding first_name}"></TextBox>
+                <Label>last name</Label>
+                <TextBox Text="{Binding last_name}"></TextBox>
+                <Label>date of birth</Label>
+                <Controls:DatePicker SelectedDate="{Binding date_of_birth}"></Controls:DatePicker>
+            </UniformGrid>
+        </DockPanel>
+        <Button Command="{Binding Save}">_Save</Button>
+        <Button Command="{Binding Cancel}">_Cancel</Button>
+        </StackPanel>
+    </DockPanel>
+</Window>
product/client/presentation.windows/views/AddFamilyMemberDialog.xaml.cs
@@ -0,0 +1,19 @@
+using System.Windows;
+using presentation.windows.presenters;
+
+namespace presentation.windows.views
+{
+    public partial class AddFamilyMemberDialog : Dialog<AddFamilyMemberPresenter>
+    {
+        public AddFamilyMemberDialog()
+        {
+            InitializeComponent();
+        }
+
+        public void show_dialog(Window parent)
+        {
+            Owner = parent;
+            ShowDialog();
+        }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/views/MainMenu.cs
@@ -0,0 +1,14 @@
+using System.Windows.Controls;
+
+namespace presentation.windows.views
+{
+    public class MainMenu : Menu
+    {
+        public MenuItem add(string header)
+        {
+            var menu_item = new MenuItem {Header = header};
+            Items.Add(menu_item);
+            return menu_item;
+        }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/views/MenuItemExtensions.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Windows.Controls;
+using presentation.windows.presenters;
+
+namespace presentation.windows.views
+{
+    static public class MenuItemExtensions
+    {
+        static public MenuItem add(this MenuItem item, string header, Action action)
+        {
+            var menu_item = new MenuItem {Header = header, Command = new SimpleCommand(action)};
+            item.Items.Add(menu_item);
+            return menu_item;
+        }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/views/ShellWIndow.xaml
@@ -1,10 +1,9 @@
 <Window x:Class="presentation.windows.views.ShellWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MoMoney - (ALPHA)" MinHeight="600" MinWidth="800" WindowStartupLocation="CenterScreen" WindowState="Maximized">
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ui="clr-namespace:presentation.windows.views" Title="MoMoney - (ALPHA)" MinHeight="600" MinWidth="800" WindowStartupLocation="CenterScreen" WindowState="Maximized">
     <DockPanel  VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
-        <Menu Name="Menu" DockPanel.Dock="Top">
-            <MenuItem Header="File"></MenuItem>
-        </Menu>
+        <ui:MainMenu x:Name="Menu" DockPanel.Dock="Top">
+        </ui:MainMenu>
         <StatusBar Name="StatusBar" HorizontalAlignment="Right" DockPanel.Dock="Bottom">
             <Label>Test</Label>
         </StatusBar>
product/client/presentation.windows/ApplicationController.cs
@@ -4,6 +4,7 @@ namespace presentation.windows
 {
     public interface ApplicationController
     {
-        void add_tab<Presenter, View>() where Presenter : TabPresenter where View : FrameworkElement, Tab<Presenter>, new();
+        void add_tab<Presenter, Tab>() where Presenter : TabPresenter where Tab : FrameworkElement, Tab<Presenter>, new();
+        void launch_dialog<Presenter, Dialog>() where Presenter : DialogPresenter where Dialog : FrameworkElement, Dialog<Presenter>, new();
     }
 }
\ No newline at end of file
product/client/presentation.windows/ComposeShell.cs
@@ -1,4 +1,5 @@
 using System.Threading;
+using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Controls.Primitives;
 using presentation.windows.presenters;
@@ -29,6 +30,19 @@ namespace presentation.windows
 
             region_manager.region<StatusBar>(x => x.Items.Add(new Label {Content = Thread.CurrentPrincipal.Identity.Name}));
             region_manager.region<StatusBar>(x => x.Items.Add(new Label {Content = "Software Developer"}));
+
+            region_manager.region<MainMenu>(x =>
+            {
+                x.add("_File").add("E_xit", () =>
+                {
+                    Application.Current.Shutdown();
+                });
+                x.add("F_amily").add("_Add Member", () =>
+                {
+                    controller.launch_dialog<AddFamilyMemberPresenter, AddFamilyMemberDialog>();
+                    MessageBox.Show("Add Family");
+                });
+            });
         }
     }
 }
\ No newline at end of file
product/client/presentation.windows/Dialog.cs
@@ -0,0 +1,10 @@
+using System.Windows;
+
+namespace presentation.windows
+{
+    public interface Dialog<TPresenter> : View<TPresenter> where TPresenter : DialogPresenter
+    {
+        void show_dialog(Window parent);
+        void Close();
+    }
+}
\ No newline at end of file
product/client/presentation.windows/DialogPresenter.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace presentation.windows
+{
+    public interface DialogPresenter : Presenter
+    {
+        Action close { set; }
+    }
+}
\ No newline at end of file
product/client/presentation.windows/presentation.windows.csproj
@@ -9,7 +9,7 @@
     <OutputType>WinExe</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>presentation.windows</RootNamespace>
-    <AssemblyName>presentation.windows</AssemblyName>
+    <AssemblyName>momoney.wpf</AssemblyName>
     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
@@ -61,8 +61,13 @@
     <Reference Include="PresentationFramework">
       <RequiredTargetFramework>3.0</RequiredTargetFramework>
     </Reference>
+    <Reference Include="WPFToolkit, Version=3.5.40128.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
   </ItemGroup>
   <ItemGroup>
+    <Page Include="views\AddFamilyMemberDialog.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="views\CompensationTab.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
@@ -78,7 +83,21 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="ApplicationController.cs" />
+    <Compile Include="commands\ParameterizedCommandBuilder.cs" />
+    <Compile Include="Dialog.cs" />
+    <Compile Include="DialogPresenter.cs" />
+    <Compile Include="presenters\AddFamilyMemberPresenter.cs" />
+    <Compile Include="commands\CommandBuilder.cs" />
+    <Compile Include="commands\AddMemberToFamily.cs" />
     <Compile Include="presenters\CompensationPresenter.cs" />
+    <Compile Include="commands\dto\FamilyMemberToAdd.cs" />
+    <Compile Include="commands\ContainerCommandBuilder.cs" />
+    <Compile Include="commands\NamedCommand.cs" />
+    <Compile Include="commands\ContainerAwareParameterizedCommandBuilder.cs" />
+    <Compile Include="View.cs" />
+    <Compile Include="views\AddFamilyMemberDialog.xaml.cs">
+      <DependentUpon>AddFamilyMemberDialog.xaml</DependentUpon>
+    </Compile>
     <Compile Include="views\CompensationTab.xaml.cs">
       <DependentUpon>CompensationTab.xaml</DependentUpon>
     </Compile>
@@ -104,6 +123,10 @@
     </Compile>
     <Compile Include="Tab.cs" />
     <Compile Include="TabPresenter.cs" />
+    <Compile Include="presenters\IObservableCommand.cs" />
+    <Compile Include="views\MainMenu.cs" />
+    <Compile Include="views\MenuItemExtensions.cs" />
+    <Compile Include="presenters\SimpleCommand.cs" />
     <Compile Include="WpfApplicationController.cs" />
     <Compile Include="WpfPresenterFactory.cs" />
     <EmbeddedResource Include="Properties\Resources.resx">
@@ -129,6 +152,10 @@
       <Project>{DD8FD29E-7424-415C-9BA3-7D9F6ECBA161}</Project>
       <Name>utility</Name>
     </ProjectReference>
+    <ProjectReference Include="..\service.infrastructure\service.infrastructure.csproj">
+      <Project>{81412692-F3EE-4FBF-A7C7-69454DD1BD46}</Project>
+      <Name>service.infrastructure</Name>
+    </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
product/client/presentation.windows/Program.cs
@@ -6,6 +6,8 @@ using Autofac.Builder;
 using Gorilla.Commons.Infrastructure.Container;
 using gorilla.commons.infrastructure.thirdparty.Autofac;
 using gorilla.commons.utility;
+using MoMoney.Service.Infrastructure.Threading;
+using presentation.windows.commands;
 using presentation.windows.presenters;
 using presentation.windows.views;
 
@@ -18,7 +20,10 @@ namespace presentation.windows
         {
             AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
             var application = new Application();
-            application.DispatcherUnhandledException += (o, e) => {};
+            application.DispatcherUnhandledException += (o, e) =>
+            {
+                MessageBox.Show(e.to_string());
+            };
             application.ShutdownMode = ShutdownMode.OnMainWindowClose;
             application.Run(create_window());
         }
@@ -28,10 +33,17 @@ namespace presentation.windows
             var builder = new ContainerBuilder();
             var shell_window = new ShellWindow();
             builder.Register(x => shell_window).As<RegionManager>();
+
             builder.Register<ComposeShell>().As<NeedStartup>();
             builder.Register<WpfApplicationController>().As<ApplicationController>();
             builder.Register<WpfPresenterFactory>().As<PresenterFactory>();
+
             builder.Register<CompensationPresenter>();
+            builder.Register<AddFamilyMemberPresenter>();
+
+            builder.Register<ContainerCommandBuilder>().As<CommandBuilder>();
+            builder.Register<SynchronousCommandProcessor>().As<CommandProcessor>();
+
 
             Resolve.initialize_with(new AutofacDependencyRegistryBuilder(builder).build());
             Resolve.the<IEnumerable<NeedStartup>>().each(x => x.run());
product/client/presentation.windows/Tab.cs
@@ -1,4 +1,4 @@
 namespace presentation.windows
 {
-    public interface Tab<Presenter> where Presenter : TabPresenter {}
+    public interface Tab<Presenter> : View<Presenter> where Presenter : TabPresenter {}
 }
\ No newline at end of file
product/client/presentation.windows/View.cs
@@ -0,0 +1,4 @@
+namespace presentation.windows
+{
+    public interface View<TPresenter> where TPresenter : Presenter {}
+}
\ No newline at end of file
product/client/presentation.windows/WpfApplicationController.cs
@@ -1,5 +1,6 @@
 using System.Windows;
 using System.Windows.Controls;
+using presentation.windows.views;
 
 namespace presentation.windows
 {
@@ -24,5 +25,20 @@ namespace presentation.windows
                                                                    Content = new View {DataContext = presenter}
                                                                }));
         }
+
+        public void launch_dialog<Presenter, Dialog>() where Presenter : DialogPresenter where Dialog : FrameworkElement, Dialog<Presenter>, new()
+        {
+            var presenter = factory.create<Presenter>();
+            var dialog = new Dialog {DataContext = presenter};
+            presenter.close = () =>
+            {
+                dialog.Close();
+            };
+            presenter.present();
+            region_manager.region<ShellWindow>(x =>
+            {
+                dialog.show_dialog(x);
+            });
+        }
     }
 }
\ No newline at end of file
product/client/presentation.winforms/helpers/BindableTextBoxExtensions.cs
@@ -21,7 +21,7 @@ namespace MoMoney.Presentation.Winforms.Helpers
         static public IBindableTextBox<ItemToBindTo> apply<ItemToBindTo>(this IBindableTextBox<ItemToBindTo> textbox,
                                                                          params ITextBoxCommand<ItemToBindTo>[] commands)
         {
-            commands.each(x => textbox.on_leave(y => x.run(y)));
+            commands.each(x => textbox.on_leave(y => x.run_against(y)));
             return textbox;
         }
     }
product/client/presentation.winforms/helpers/ITextBoxCommand.cs
@@ -1,6 +1,6 @@
-using gorilla.commons.utility;
-
+using gorilla.commons.utility;
+
 namespace MoMoney.Presentation.Winforms.Helpers
 {
-    public interface ITextBoxCommand<T> : ParameterizedCommand<IBindableTextBox<T>> {}
+    public interface ITextBoxCommand<T> : ArgCommand<IBindableTextBox<T>> {}
 }
\ No newline at end of file
product/client/presentation.winforms/helpers/RebindTextBoxCommand.cs
@@ -12,7 +12,7 @@ namespace MoMoney.Presentation.Winforms.Helpers
             this.binder = binder;
         }
 
-        public void run(IBindableTextBox<T> item)
+        public void run_against(IBindableTextBox<T> item)
         {
             item.bind_to(binder.Compile()(item.text()));
         }
product/client/presentation.winforms/views/AddBillPaymentView.cs
@@ -28,12 +28,12 @@ namespace MoMoney.Presentation.Winforms.Views
             submit_clicked = x => presenter.submit_bill_payment(create_dto());
         }
 
-        public void run(IEnumerable<CompanyDTO> companys)
+        public void run_against(IEnumerable<CompanyDTO> companys)
         {
             companies_list.bind_to(companys);
         }
 
-        public void run(IEnumerable<BillInformationDTO> bills)
+        public void run_against(IEnumerable<BillInformationDTO> bills)
         {
             ux_bill_payments_grid.DataSource = bills.databind();
         }
product/client/presentation.winforms/views/AddCompanyView.cs
@@ -42,7 +42,7 @@ namespace MoMoney.Presentation.Winforms.Views
             };
         }
 
-        public void run(IEnumerable<CompanyDTO> companies)
+        public void run_against(IEnumerable<CompanyDTO> companies)
         {
             companiesListView.Items.Clear();
             companiesListView.Items.AddRange(companies.Select(x => new ListViewItem(x.name, 0)).ToArray());
product/client/presentation.winforms/views/AddNewIncomeView.cs
@@ -31,12 +31,12 @@ namespace MoMoney.Presentation.Winforms.Views
             submit_button = x => presenter.submit_new(create_income());
         }
 
-        public void run(IEnumerable<CompanyDTO> companies)
+        public void run_against(IEnumerable<CompanyDTO> companies)
         {
             companies_list.bind_to(companies);
         }
 
-        public void run(IEnumerable<IncomeInformationDTO> incomes)
+        public void run_against(IEnumerable<IncomeInformationDTO> incomes)
         {
             ux_income_received_grid.DataSource = incomes.databind();
         }
product/client/presentation.winforms/views/CheckForUpdatesView.cs
@@ -64,7 +64,7 @@ namespace MoMoney.Presentation.Winforms.Views
             downloaded(100);
         }
 
-        public void run(ApplicationVersion information)
+        public void run_against(ApplicationVersion information)
         {
             if (information.updates_available)
             {
product/client/presentation.winforms/views/LogFileView.cs
@@ -17,7 +17,7 @@ namespace MoMoney.Presentation.Winforms.Views
                 .icon(ApplicationIcons.ViewLog);
         }
 
-        public void run(string file_contents)
+        public void run_against(string file_contents)
         {
             ux_log_file.Text = file_contents;
         }
product/client/presentation.winforms/views/ViewAllBills.cs
@@ -19,7 +19,7 @@ namespace MoMoney.Presentation.Winforms.Views
         {
         }
 
-        public void run(IEnumerable<BillInformationDTO> bills)
+        public void run_against(IEnumerable<BillInformationDTO> bills)
         {
             ux_bills.DataSource = bills.ToList();
         }
product/client/presentation.winforms/views/ViewAllBillsReport.cs
@@ -18,7 +18,7 @@ namespace MoMoney.Presentation.Winforms.Views
 
         public string name { get; private set; }
 
-        public void run(IEnumerable<BillInformationDTO> bills)
+        public void run_against(IEnumerable<BillInformationDTO> bills)
         {
             ux_company_name.bind_to<BillInformationDTO, string>(x => x.company_name);
             ux_amount.bind_to<BillInformationDTO, string>(x => x.the_amount_owed);
product/client/presentation.winforms/views/ViewAllIncome.cs
@@ -17,7 +17,7 @@ namespace MoMoney.Presentation.Winforms.Views
 
         public void attach_to(ViewIncomeHistoryPresenter presenter) {}
 
-        public void run(IEnumerable<IncomeInformationDTO> summary)
+        public void run_against(IEnumerable<IncomeInformationDTO> summary)
         {
             ux_view_all_income.DataSource = summary.databind();
         }
product/client/presentation.winforms/views/ViewAllIncomesReport.cs
@@ -17,7 +17,7 @@ namespace MoMoney.Presentation.Winforms.Views
 
         public string name { get; private set; }
 
-        public void run(IEnumerable<IncomeInformationDTO> income)
+        public void run_against(IEnumerable<IncomeInformationDTO> income)
         {
             ux_company_name.bind_to<IncomeInformationDTO, string>(x => x.company);
             ux_amount.bind_to<IncomeInformationDTO, string>(x => x.amount);
product/client/service/Application/AddNewIncomeCommand.cs
@@ -22,7 +22,7 @@ namespace MoMoney.Service.Application
             this.companys = companys;
         }
 
-        public void run(IncomeSubmissionDTO item)
+        public void run_against(IncomeSubmissionDTO item)
         {
             if (similar_income_has_been_submitted(item))
             {
product/client/service/Application/RegisterNewCompanyCommand.cs
@@ -20,7 +20,7 @@ namespace MoMoney.Service.Application
             this.companies = companies;
         }
 
-        public void run(RegisterNewCompany item)
+        public void run_against(RegisterNewCompany item)
         {
             if (is_there_a_company_registered_with(item.company_name))
                 notification.notify(create_error_message_from(item));
product/client/service/Application/SaveNewBillCommand.cs
@@ -15,7 +15,7 @@ namespace MoMoney.Service.Application
             this.tasks = tasks;
         }
 
-        public void run(AddNewBillDTO item)
+        public void run_against(AddNewBillDTO item)
         {
             companys
                 .find_company_by(item.company_id)
product/client/service/Service.csproj
@@ -31,10 +31,6 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="gorilla.commons.utility, Version=2009.5.5.1633, Culture=neutral, PublicKeyToken=687787ccb6c36c9f, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\build\lib\app\gorilla\gorilla.commons.utility.dll</HintPath>
-    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
product/client/service.contracts/Application/IAddNewIncomeCommand.cs
@@ -1,9 +1,9 @@
 using System.ServiceModel;
-using gorilla.commons.utility;
+using gorilla.commons.utility;
 using MoMoney.DTO;
 
 namespace MoMoney.Service.Contracts.Application
 {
     [ServiceContract]
-    public interface IAddNewIncomeCommand : ParameterizedCommand<IncomeSubmissionDTO> {}
+    public interface IAddNewIncomeCommand : ArgCommand<IncomeSubmissionDTO> {}
 }
\ No newline at end of file
product/client/service.contracts/Application/IRegisterNewCompanyCommand.cs
@@ -1,9 +1,9 @@
 using System.ServiceModel;
-using gorilla.commons.utility;
+using gorilla.commons.utility;
 using MoMoney.DTO;
 
 namespace MoMoney.Service.Contracts.Application
 {
     [ServiceContract]
-    public interface IRegisterNewCompanyCommand : ParameterizedCommand<RegisterNewCompany> {}
+    public interface IRegisterNewCompanyCommand : ArgCommand<RegisterNewCompany> {}
 }
\ No newline at end of file
product/client/service.contracts/Application/ISaveNewBillCommand.cs
@@ -1,9 +1,9 @@
 using System.ServiceModel;
-using gorilla.commons.utility;
+using gorilla.commons.utility;
 using MoMoney.DTO;
 
 namespace MoMoney.Service.Contracts.Application
 {
     [ServiceContract]
-    public interface ISaveNewBillCommand : ParameterizedCommand<AddNewBillDTO> {}
+    public interface ISaveNewBillCommand : ArgCommand<AddNewBillDTO> {}
 }
\ No newline at end of file
product/client/service.contracts/Service.Contracts.csproj
@@ -31,10 +31,6 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="gorilla.commons.utility, Version=2009.9.4.1823, Culture=neutral, PublicKeyToken=687787ccb6c36c9f, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\build\lib\app\gorilla\gorilla.commons.utility.dll</HintPath>
-    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
product/client/service.infrastructure/threading/RunOnUIThread.cs
@@ -17,7 +17,7 @@ namespace momoney.service.infrastructure.threading
 
         public void Intercept(IInvocation invocation)
         {
-            factory.create().run(new AnonymousCommand(invocation.Proceed));
+            factory.create().run_against(new AnonymousCommand(invocation.Proceed));
         }
     }
 }
\ No newline at end of file
product/client/service.infrastructure/threading/SynchronizedCommand.cs
@@ -1,10 +1,10 @@
 using System;
 using System.Threading;
-using gorilla.commons.utility;
-
+using gorilla.commons.utility;
+
 namespace momoney.service.infrastructure.threading
 {
-    public interface ISynchronizedCommand : ParameterizedCommand<Action>, ParameterizedCommand<Command> {}
+    public interface ISynchronizedCommand : ArgCommand<Action>, ArgCommand<Command> {}
 
     public class SynchronizedCommand : ISynchronizedCommand
     {
@@ -15,14 +15,14 @@ namespace momoney.service.infrastructure.threading
             this.context = context;
         }
 
-        public void run(Action item)
+        public void run_against(Action item)
         {
             context.Post(x => item(), new object());
         }
 
-        public void run(Command item)
+        public void run_against(Command item)
         {
-            run(item.run);
+            run_against(item.run);
         }
     }
 }
\ No newline at end of file
product/client/service.infrastructure/threading/SynchronizedContext.cs
@@ -1,9 +1,9 @@
 using System.Threading;
-using gorilla.commons.utility;
-
+using gorilla.commons.utility;
+
 namespace momoney.service.infrastructure.threading
 {
-    public interface ISynchronizationContext : ParameterizedCommand<Command> {}
+    public interface ISynchronizationContext : ArgCommand<Command> {}
 
     public class SynchronizedContext : ISynchronizationContext
     {
@@ -14,7 +14,7 @@ namespace momoney.service.infrastructure.threading
             this.context = context;
         }
 
-        public void run(Command item)
+        public void run_against(Command item)
         {
             context.Post(x => item.run(), new object());
             //context.Send(x => item.run(), new object());
product/client/service.infrastructure/updating/DownloadTheLatestVersion.cs
@@ -13,10 +13,10 @@ namespace MoMoney.Service.Infrastructure.Updating
             this.deployment = deployment;
         }
 
-        public void run(Callback<Percent> callback)
+        public void run_against(Callback<Percent> callback)
         {
-            deployment.UpdateProgressChanged += (o, e) => callback.run(new Percent(e.BytesCompleted, e.BytesTotal));
-            deployment.UpdateCompleted += (sender, args) => callback.run(100);
+            deployment.UpdateProgressChanged += (o, e) => callback.run_against(new Percent(e.BytesCompleted, e.BytesTotal));
+            deployment.UpdateCompleted += (sender, args) => callback.run_against(100);
             deployment.UpdateAsync();
         }
     }
product/client/service.infrastructure/service.infrastructure.csproj
@@ -35,22 +35,6 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\build\lib\app\castle\Castle.Core.dll</HintPath>
     </Reference>
-    <Reference Include="gorilla.commons.infrastructure, Version=2009.10.21.739, Culture=neutral, PublicKeyToken=687787ccb6c36c9f, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\build\lib\app\gorilla\gorilla.commons.infrastructure.dll</HintPath>
-    </Reference>
-    <Reference Include="gorilla.commons.infrastructure.thirdparty, Version=2009.10.21.739, Culture=neutral, PublicKeyToken=687787ccb6c36c9f, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\build\lib\app\gorilla\gorilla.commons.infrastructure.thirdparty.dll</HintPath>
-    </Reference>
-    <Reference Include="gorilla.commons.utility, Version=2009.10.21.739, Culture=neutral, PublicKeyToken=687787ccb6c36c9f, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\build\lib\app\gorilla\gorilla.commons.utility.dll</HintPath>
-    </Reference>
-    <Reference Include="Rhino.Mocks, Version=3.5.0.1337, Culture=neutral, PublicKeyToken=0b3305902db7183f, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\build\lib\test\rhino.mocks\Rhino.Mocks.dll</HintPath>
-    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
product/commons/utility/ArgCommand.cs
@@ -0,0 +1,7 @@
+namespace gorilla.commons.utility
+{
+    public interface ArgCommand<T>
+    {
+        void run_against(T item);
+    }
+}
\ No newline at end of file
product/commons/utility/Callback.cs
@@ -4,7 +4,7 @@ namespace gorilla.commons.utility
     {
     }
 
-    public interface Callback<T> : ParameterizedCommand<T>
+    public interface Callback<T> : ArgCommand<T>
     {
     }
 }
\ No newline at end of file
product/commons/utility/CallbackCommand.cs
@@ -1,6 +1,6 @@
 namespace gorilla.commons.utility
 {
-    public interface CallbackCommand<T> : ParameterizedCommand<Callback<T>>
+    public interface CallbackCommand<T> : ArgCommand<Callback<T>>
     {
     }
 }
\ No newline at end of file
product/commons/utility/ChainedParameterizedCommand.cs
@@ -1,20 +1,20 @@
 namespace gorilla.commons.utility
 {
-    public class ChainedParameterizedCommand<T> : ParameterizedCommand<T>
+    public class ChainedCommand<T> : ArgCommand<T>
     {
-        ParameterizedCommand<T> left;
-        ParameterizedCommand<T> right;
+        ArgCommand<T> left;
+        ArgCommand<T> right;
 
-        public ChainedParameterizedCommand(ParameterizedCommand<T> left, ParameterizedCommand<T> right)
+        public ChainedCommand(ArgCommand<T> left, ArgCommand<T> right)
         {
             this.left = left;
             this.right = right;
         }
 
-        public void run(T item)
+        public void run_against(T item)
         {
-            left.run(item);
-            right.run(item);
+            left.run_against(item);
+            right.run_against(item);
         }
     }
 }
\ No newline at end of file
product/commons/utility/Command.cs
@@ -1,7 +1,7 @@
-namespace gorilla.commons.utility
-{
-    public interface Command
-    {
-        void run();
-    }
+namespace gorilla.commons.utility
+{
+    public interface Command
+    {
+        void run();
+    }
 }
\ No newline at end of file
product/commons/utility/CommandExtensions.cs
@@ -1,5 +1,5 @@
-using System;
-
+using System;
+
 namespace gorilla.commons.utility
 {
     static public class CommandExtensions
@@ -19,9 +19,9 @@ namespace gorilla.commons.utility
             return new ChainedCommand(left, new AnonymousCommand(right));
         }
 
-        static public ParameterizedCommand<T> then<T>(this ParameterizedCommand<T> left, ParameterizedCommand<T> right)
+        static public ArgCommand<T> then<T>(this ArgCommand<T> left, ArgCommand<T> right)
         {
-            return new ChainedParameterizedCommand<T>(left, right);
+            return new ChainedCommand<T>(left, right);
         }
     }
 }
\ No newline at end of file
product/commons/utility/EmptyCallback.cs
@@ -2,7 +2,7 @@ namespace gorilla.commons.utility
 {
     public class EmptyCallback<T> : Callback<T>, Callback
     {
-        public void run(T item) {}
+        public void run_against(T item) {}
 
         public void run() {}
     }
product/commons/utility/ParameterizedCommand.cs
@@ -1,7 +0,0 @@
-namespace gorilla.commons.utility
-{
-    public interface ParameterizedCommand<T>
-    {
-        void run(T item);
-    }
-}
\ No newline at end of file
product/commons/utility/utility.csproj
@@ -54,6 +54,7 @@
     <Compile Include="ChainedCommand.cs" />
     <Compile Include="ChainedConfiguration.cs" />
     <Compile Include="ChainedMapper.cs" />
+    <Compile Include="Command.cs" />
     <Compile Include="EmptyCallback.cs" />
     <Compile Include="EmptyCommand.cs" />
     <Compile Include="DefaultConstructorFactory.cs" />
@@ -63,7 +64,7 @@
     <Compile Include="Builder.cs" />
     <Compile Include="Callback.cs" />
     <Compile Include="CallbackCommand.cs" />
-    <Compile Include="Command.cs" />
+    <Compile Include="ArgCommand.cs" />
     <Compile Include="Configuration.cs" />
     <Compile Include="ComponentFactory.cs" />
     <Compile Include="Id.cs" />
@@ -73,7 +74,6 @@
     <Compile Include="Import.cs" />
     <Compile Include="Mapper.cs" />
     <Compile Include="Notification.cs" />
-    <Compile Include="ParameterizedCommand.cs" />
     <Compile Include="Parser.cs" />
     <Compile Include="Query.cs" />
     <Compile Include="Registry.cs" />
product/tests/unit/client/boot/container/registration/AutoWiteComponentsInToTheSpecs.cs
@@ -52,7 +52,7 @@ namespace tests.unit.client.boot.container.registration
                 .it_will_return(false);
         };
 
-        because b = () => sut.run(assembly);
+        because b = () => sut.run_against(assembly);
 
 
         static Assembly assembly;
product/tests/unit/client/presentation/model/NewCommandSpecs.cs
@@ -20,7 +20,7 @@ namespace tests.unit.client.presentation.model
     public class before_starting_a_new_project : behaves_like_new_command
     {
         it should_check_to_see_if_there_were_any_unsaved_changes_to_a_previous_project =
-            () => save_changes_command.was_told_to(x => x.run(sut));
+            () => save_changes_command.was_told_to(x => x.run_against(sut));
 
         because b = () => sut.run();
     }
product/tests/unit/client/presentation/model/OpenCommandSpecs.cs
@@ -24,7 +24,7 @@ namespace tests.unit.client.presentation.model
     public class before_opening_a_new_project : behaves_like_command_to_open_a_project
     {
         it should_check_to_see_if_you_want_to_save_the_previously_opened_project =
-            () => save_changes_command.was_told_to(x => x.run(sut));
+            () => save_changes_command.was_told_to(x => x.run_against(sut));
 
         because b = () => sut.run();
     }
product/tests/unit/client/presentation/model/ProjectControllerSpecs.cs
@@ -154,7 +154,7 @@ namespace tests.unit.client.presentation.model
 
             because b = () =>
             {
-                sut.downcast_to<ProjectController>().run(unit_of_work);
+                sut.downcast_to<ProjectController>().run_against(unit_of_work);
                 result = sut.has_unsaved_changes();
             };
 
product/tests/unit/client/presentation/presenters/CheckForUpdatesPresenterSpecs.cs
@@ -58,14 +58,14 @@ namespace tests.unit.client.presentation.presenters
         {
             it should_notify_you_of_the_progress_of_the_update = () => view.was_told_to(x => x.downloaded(50));
 
-            because b = () => sut.run(50);
+            because b = () => sut.run_against(50);
         }
 
         public class when_an_update_is_completed : concern
         {
             it should_notify_the_view_that_the_update_is_complete = () => view.was_told_to(x => x.update_complete());
 
-            because b = () => sut.run(100);
+            because b = () => sut.run_against(100);
         }
 
         public class when_an_update_is_cancelled : concern
product/tests/unit/client/presentation/winforms/helpers/BindableTextBoxExtensionsSpecs.cs
@@ -9,7 +9,7 @@ namespace tests.unit.client.presentation.winforms.helpers
         [Concern(typeof (BindableTextBoxExtensions))]
         public class when_binding_a_text_control_to_a_command : concerns
         {
-            it should_run_each_command_when_the_text_changes_in_the_text_control = () => command.was_told_to(x => x.run(result));
+            it should_run_each_command_when_the_text_changes_in_the_text_control = () => command.was_told_to(x => x.run_against(result));
 
             context c = () =>
             {
product/tests/unit/client/presentation/winforms/helpers/RebindTextBoxCommandSpecs.cs
@@ -36,6 +36,6 @@ namespace tests.unit.client.presentation.winforms.helpers
             textbox.is_told_to(x => x.text()).it_will_return("kitty");
         };
 
-        because b = () => sut.run(textbox);
+        because b = () => sut.run_against(textbox);
     }
 }
\ No newline at end of file
product/tests/unit/client/service/application/AddNewIncomeCommandSpecs.cs
@@ -54,7 +54,7 @@ namespace tests.unit.client.service.application
                 all_income.is_told_to(x => x.all()).it_will_return(matching_income);
             };
 
-            because b = () => sut.run(income);
+            because b = () => sut.run_against(income);
 
             static IncomeSubmissionDTO income;
         }