<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>LarsW.CommandLineParser.4.1.resharper.user</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/LarsW.CommandLineParser.TestApp.csproj.user</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/bin/Debug/LarsW.CommandLineParser.TestApp.exe</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/bin/Debug/LarsW.CommandLineParser.TestApp.pdb</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/bin/Debug/LarsW.CommandLineParser.TestApp.vshost.exe</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/bin/Debug/LarsW.CommandLineParser.dll</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/bin/Debug/LarsW.CommandLineParser.pdb</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/bin/Debug/System.Dataflow.dll</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/bin/Debug/Xaml.dll</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/obj/Debug/LarsW.CommandLineParser.TestApp.csproj.FileListAbsolute.txt</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/obj/Debug/LarsW.CommandLineParser.TestApp.exe</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/obj/Debug/LarsW.CommandLineParser.TestApp.pdb</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.TestApp/obj/Debug/ResolveAssemblyReference.cache</filename>
    </added>
    <added>
      <filename>LarsW.CommandLineParser.suo</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/CommandLineArgumentHandlerNotFoundException.cs</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/CommandLineParsingFailedException.cs</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/bin/Debug/LarsW.CommandLineParser.dll</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/bin/Debug/LarsW.CommandLineParser.pdb</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/bin/Debug/Microsoft.M.Grammar.dll</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/bin/Debug/System.Dataflow.dll</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/bin/Debug/Xaml.dll</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/obj/Debug/LarsW.CommandLineParser.csproj.FileListAbsolute.txt</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/obj/Debug/LarsW.CommandLineParser.dll</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/obj/Debug/LarsW.CommandLineParser.obj.Debug.LarsW.CommandLineParser.resources.resources</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/obj/Debug/LarsW.CommandLineParser.pdb</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/obj/Debug/LarsW.CommandlineParser.resources</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/obj/Debug/Refactor/LarsW.CommandlineParser.dll</filename>
    </added>
    <added>
      <filename>LarsW.CommandlineParser/obj/Debug/mgargs.rsp</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/407a588d-62d3-4c1d-9fc6-f6415a8d5e95.Metadata</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/5502b587-b989-4e09-bec4-b4508dde4bd5.Metadata</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/8da63f1e-d8cc-47e5-8caf-94e030967c0f.Metadata</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/CachesImage.bin</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/ReflectionCache.xml</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/TodoCache/.version</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/TodoCache/2/5d41398c.dat</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/WordIndex.New/.version</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/WordIndex.New/2/5d41398c.dat</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/c14bd60c-6bbc-42a3-9d33-32a3fb031c6f.Metadata</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/c14bd60c-6bbc-42a3-9d33-32a3fb031c6f.XmlDocIndex</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/c492e9f7-f29c-4211-8cd7-d904f7920097.Metadata</filename>
    </added>
    <added>
      <filename>_ReSharper.LarsW.CommandLineParser/c492e9f7-f29c-4211-8cd7-d904f7920097.XmlDocIndex</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -8,8 +8,8 @@
     &lt;ProjectGuid&gt;{4C0871B6-88F1-415C-A997-CF8559A7A372}&lt;/ProjectGuid&gt;
     &lt;OutputType&gt;Exe&lt;/OutputType&gt;
     &lt;AppDesignerFolder&gt;Properties&lt;/AppDesignerFolder&gt;
-    &lt;RootNamespace&gt;Mockup.CommandLineParser.TestApp&lt;/RootNamespace&gt;
-    &lt;AssemblyName&gt;Mockup.CommandLineParser.TestApp&lt;/AssemblyName&gt;
+    &lt;RootNamespace&gt;LarsW.CommandLineParser.TestApp&lt;/RootNamespace&gt;
+    &lt;AssemblyName&gt;LarsW.CommandLineParser.TestApp&lt;/AssemblyName&gt;
     &lt;TargetFrameworkVersion&gt;v3.5&lt;/TargetFrameworkVersion&gt;
     &lt;FileAlignment&gt;512&lt;/FileAlignment&gt;
   &lt;/PropertyGroup&gt;
@@ -31,31 +31,16 @@
     &lt;WarningLevel&gt;4&lt;/WarningLevel&gt;
   &lt;/PropertyGroup&gt;
   &lt;ItemGroup&gt;
-    &lt;Reference Include=&quot;Microsoft.M.Grammar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL&quot;&gt;
-      &lt;SpecificVersion&gt;False&lt;/SpecificVersion&gt;
-      &lt;HintPath&gt;..\Dependencies\Microsoft.M.Grammar.dll&lt;/HintPath&gt;
-    &lt;/Reference&gt;
     &lt;Reference Include=&quot;System&quot; /&gt;
-    &lt;Reference Include=&quot;System.Core&quot;&gt;
-      &lt;RequiredTargetFramework&gt;3.5&lt;/RequiredTargetFramework&gt;
-    &lt;/Reference&gt;
-    &lt;Reference Include=&quot;System.Dataflow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL&quot;&gt;
-      &lt;SpecificVersion&gt;False&lt;/SpecificVersion&gt;
-      &lt;HintPath&gt;..\Dependencies\System.Dataflow.dll&lt;/HintPath&gt;
-    &lt;/Reference&gt;
-    &lt;Reference Include=&quot;Xaml, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL&quot;&gt;
-      &lt;SpecificVersion&gt;False&lt;/SpecificVersion&gt;
-      &lt;HintPath&gt;..\Dependencies\Xaml.dll&lt;/HintPath&gt;
-    &lt;/Reference&gt;
   &lt;/ItemGroup&gt;
   &lt;ItemGroup&gt;
     &lt;Compile Include=&quot;Program.cs&quot; /&gt;
     &lt;Compile Include=&quot;Properties\AssemblyInfo.cs&quot; /&gt;
   &lt;/ItemGroup&gt;
   &lt;ItemGroup&gt;
-    &lt;ProjectReference Include=&quot;..\LarsW.CommandlineParser\LarsW.CommandlineParser.csproj&quot;&gt;
+    &lt;ProjectReference Include=&quot;..\LarsW.CommandlineParser\LarsW.CommandLineParser.csproj&quot;&gt;
       &lt;Project&gt;{D222E890-8948-4A74-A59A-DB682AA6AC4C}&lt;/Project&gt;
-      &lt;Name&gt;LarsW.CommandlineParser&lt;/Name&gt;
+      &lt;Name&gt;LarsW.CommandLineParser&lt;/Name&gt;
     &lt;/ProjectReference&gt;
   &lt;/ItemGroup&gt;
   &lt;Import Project=&quot;$(MSBuildToolsPath)\Microsoft.CSharp.targets&quot; /&gt;</diff>
      <filename>LarsW.CommandLineParser.TestApp/LarsW.CommandLineParser.TestApp.csproj</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,13 @@
-&#65279;namespace Mockup.CommandLineParser
+&#65279;namespace LarsW.CommandLineParser.TestApp
 {
-    using LarsW.CommandlineParser;
-using System.Text;
+    using System;
+    using System.Text;
 
     class Processor
     {
         private StringBuilder _output = new StringBuilder();
+        public bool BogusSet { get; set; }
+
         public string Output
         {
             get { return _output.ToString(); }
@@ -20,6 +22,7 @@ using System.Text;
         [CommandLineArgumentHandler(&quot;b&quot;, &quot;bogus&quot;, &quot;Just a bogus test command.&quot;)]
         public void BHandler()
         {
+            BogusSet = true;
         }
     }
 
@@ -28,7 +31,11 @@ using System.Text;
         static void Main(string[] args)
         {
             var processor = new Processor();
+            Console.WriteLine(&quot;Processing the command line:&quot;);
             CommandLineProcessor.Process(processor, args);
+            Console.WriteLine(&quot;Output: &quot; + processor.Output);
+            Console.WriteLine(&quot;Bogus set: &quot; + processor.BogusSet);
+            Console.ReadLine();
         }
     }
-}
+}
\ No newline at end of file</diff>
      <filename>LarsW.CommandLineParser.TestApp/Program.cs</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 10.00
 # Visual Studio 2008
 Project(&quot;{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&quot;) = &quot;LarsW.CommandLineParser.TestApp&quot;, &quot;LarsW.CommandLineParser.TestApp\LarsW.CommandLineParser.TestApp.csproj&quot;, &quot;{4C0871B6-88F1-415C-A997-CF8559A7A372}&quot;
 EndProject
-Project(&quot;{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&quot;) = &quot;LarsW.CommandlineParser&quot;, &quot;LarsW.CommandlineParser\LarsW.CommandlineParser.csproj&quot;, &quot;{D222E890-8948-4A74-A59A-DB682AA6AC4C}&quot;
+Project(&quot;{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&quot;) = &quot;LarsW.CommandLineParser&quot;, &quot;LarsW.CommandlineParser\LarsW.CommandLineParser.csproj&quot;, &quot;{D222E890-8948-4A74-A59A-DB682AA6AC4C}&quot;
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution</diff>
      <filename>LarsW.CommandLineParser.sln</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,8 @@
-namespace LarsW.CommandlineParser
+namespace LarsW.CommandLineParser
 {
     using System;
 
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
     public sealed class CommandLineArgumentHandlerAttribute : Attribute
     {
         public string ShortArgumentName { get; private set; }</diff>
      <filename>LarsW.CommandlineParser/CommandLineArgumentHandlerAttribute.cs</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,9 @@
-&#65279;namespace LarsW.CommandlineParser
+&#65279;using System.Text;
+
+namespace LarsW.CommandLineParser
 {
     using System;
+    using System.Collections.Generic;
     using System.Dataflow;
     using System.Diagnostics;
     using System.IO;
@@ -9,59 +12,87 @@
 
     public class CommandLineProcessor
     {
-        private static bool _initialized;
-        private static DynamicParser _parser;
+        internal class Handler
+        {
+            public MethodInfo MethodInfo { get; set; }
+            public CommandLineArgumentHandlerAttribute Attribute { get; set; }
+        }
+        private static List&lt;Handler&gt; _handlers = new List&lt;Handler&gt;();
 
-        public event EventHandler&lt;CommandlineArgumentArgs&gt; ProcessingArgument = delegate { };
+        public event EventHandler&lt;CommandLineArgumentArgs&gt; ProcessingArgument = delegate { };
 
         public static void Process(object handlerInstance, string[] args)
         {
-            if (!_initialized)
+            var parser = DynamicParser.LoadFromResource(Assembly.GetExecutingAssembly().GetName().Name, &quot;LarsW.Languages.CommandLineLang&quot;);
+
+            string commandLine = null;
+            commandLine = BuildCommandLine(args);
+            var errorReporter = ErrorReporter.Standard;
+            var root = parser.Parse&lt;object&gt;(null, new StringReader(commandLine), errorReporter);
+            if (root == null)
             {
-                Initialize();
+                throw new CommandLineParsingFailedException();
             }
-            var reader = new StringReader(string.Join(&quot; &quot;, args));
-            var root = _parser.Parse&lt;object&gt;(null, reader, ErrorReporter.Standard);
-            var builder = _parser.GraphBuilder;
+            var builder = parser.GraphBuilder;
+
+            var handlerType = handlerInstance.GetType();
+            _handlers = (from methodInfo in handlerType.GetMethods()
+                            let attr =
+                                Attribute.GetCustomAttribute(methodInfo, typeof (CommandLineArgumentHandlerAttribute))
+                                as CommandLineArgumentHandlerAttribute
+                            where attr != null
+                            select new Handler {MethodInfo = methodInfo, Attribute = attr}).ToList();
+            
             foreach (var element in builder.GetSuccessors(root))
             {
                 var identifier = builder.GetLabel(element) as Identifier;
                 if (identifier != null &amp;&amp; identifier == Identifier.Get(&quot;Parameter&quot;))
                 {
-                    ProcessParameter(builder, element);
+                    ProcessParameter(builder, element, handlerInstance);
                 }
             }
         }
 
-        private static void Initialize()
+        private static string BuildCommandLine(string[] args)
         {
-            _parser = DynamicParser.LoadFromResource(Assembly.GetExecutingAssembly().GetName().Name, &quot;LarsW.Languages.CommandLineLang&quot;);
-            _initialized = true;
+            var sb = new StringBuilder();
+            for(int i = 0; i &lt; args.Length; i++)
+            {
+                string val = args[i];
+                if (val.Contains(&quot; &quot;) || val.Contains('\t'))
+                    val = string.Concat(&quot;\&quot;&quot;, val, &quot;\&quot;&quot;);
+
+                sb.Append(string.Concat(val, &quot; &quot;));
+            }
+            return sb.ToString().Trim();
         }
 
-        private static void ProcessParameter(IGraphBuilder builder, object parameterNode)
+        private static void ProcessParameter(IGraphBuilder builder, object parameterNode, object handlerInstance)
         {
+            
             var subNodes = builder.GetSuccessors(parameterNode);
             Debug.Assert(subNodes != null &amp;&amp; subNodes.Count() == 2);
 
             var nameNode = subNodes.First();
             Debug.Assert(builder.IsNode(nameNode));
-            var nameValue = builder.GetSuccessors(nameNode).First();
-            Console.WriteLine(&quot;Parameter: &quot; + Convert.ToString(nameValue));
+            var nameValue = builder.GetSuccessors(nameNode).First().ToString();
 
             var payloadNode = subNodes.Last();
             var payloadValueNodes = builder.GetSuccessors(payloadNode);
+            string payloadValue = null;
             if (payloadValueNodes.Count() == 1)
             {
-                var payloadValue = payloadValueNodes.First();
+                payloadValue = payloadValueNodes.First().ToString();
                 Debug.Assert(builder.IsNode(payloadNode));
-                Console.WriteLine(&quot;Value: &quot; + Convert.ToString(payloadValue));
             }
+            var handler = _handlers.Find(h =&gt; (h.Attribute.LongArgumentName == nameValue ||
+                                 h.Attribute.ShortArgumentName == nameValue));
+            if (handler == null)
+                throw new CommandLineArgumentHandlerNotFoundException(nameValue);
+            if (payloadValue != null)
+                handler.MethodInfo.Invoke(handlerInstance, new object[] {payloadValue});
             else
-            {
-                Console.WriteLine(&quot;[No value]&quot;);
-            }
+                handler.MethodInfo.Invoke(handlerInstance, null);
         }
-
     }
 }</diff>
      <filename>LarsW.CommandlineParser/CommandLineProcessor.cs</filename>
    </modified>
    <modified>
      <diff>@@ -1,14 +1,14 @@
-using System;
-
-namespace LarsW.CommandlineParser
+namespace LarsW.CommandLineParser
 {
-    public sealed class CommandlineArgumentArgs : EventArgs
+    using System;
+
+    public sealed class CommandLineArgumentArgs : EventArgs
     {
         public string ShortArgumentName { get; private set; }
         public string LongArgumentName { get; private set; }
         public string Argument { get; private set; }
 
-        public CommandlineArgumentArgs(string shortArgumentName, string longArgumentName, string argument)
+        public CommandLineArgumentArgs(string shortArgumentName, string longArgumentName, string argument)
         {
             ShortArgumentName = shortArgumentName;
             LongArgumentName = longArgumentName;</diff>
      <filename>LarsW.CommandlineParser/CommandlineArgumentArgs.cs</filename>
    </modified>
    <modified>
      <diff>@@ -15,8 +15,8 @@
     &lt;ProjectGuid&gt;{D222E890-8948-4A74-A59A-DB682AA6AC4C}&lt;/ProjectGuid&gt;
     &lt;OutputType&gt;Library&lt;/OutputType&gt;
     &lt;AppDesignerFolder&gt;Properties&lt;/AppDesignerFolder&gt;
-    &lt;RootNamespace&gt;LarsW.CommandlineParser&lt;/RootNamespace&gt;
-    &lt;AssemblyName&gt;LarsW.CommandlineParser&lt;/AssemblyName&gt;
+    &lt;RootNamespace&gt;LarsW.CommandLineParser&lt;/RootNamespace&gt;
+    &lt;AssemblyName&gt;LarsW.CommandLineParser&lt;/AssemblyName&gt;
     &lt;TargetFrameworkVersion&gt;v3.5&lt;/TargetFrameworkVersion&gt;
     &lt;FileAlignment&gt;512&lt;/FileAlignment&gt;
   &lt;/PropertyGroup&gt;
@@ -57,7 +57,9 @@
   &lt;/ItemGroup&gt;
   &lt;ItemGroup&gt;
     &lt;Compile Include=&quot;CommandLineArgumentHandlerAttribute.cs&quot; /&gt;
-    &lt;Compile Include=&quot;CommandlineArgumentArgs.cs&quot; /&gt;
+    &lt;Compile Include=&quot;CommandLineArgumentArgs.cs&quot; /&gt;
+    &lt;Compile Include=&quot;CommandLineArgumentHandlerNotFoundException.cs&quot; /&gt;
+    &lt;Compile Include=&quot;CommandLineParsingFailedException.cs&quot; /&gt;
     &lt;Compile Include=&quot;CommandLineProcessor.cs&quot; /&gt;
     &lt;Compile Include=&quot;Properties\AssemblyInfo.cs&quot; /&gt;
   &lt;/ItemGroup&gt;</diff>
      <filename>LarsW.CommandlineParser/LarsW.CommandlineParser.csproj</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,4 @@
 &#65279;using System.Reflection;
-using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 
 // General Information about an assembly is controlled through the following </diff>
      <filename>LarsW.CommandlineParser/Properties/AssemblyInfo.cs</filename>
    </modified>
    <modified>
      <diff>@@ -6,12 +6,13 @@
         syntax Parameters = p:Parameter =&gt; Parameters { p }
                           | list:Parameters p:Parameter =&gt; Parameters {valuesof(list), p};
                           
-        syntax Parameter = &quot;/&quot; s:Switch p:Payload =&gt; Parameter{Name {s}, Payload {valuesof(p)}};
+        syntax Parameter = tSwitchOperator s:Switch p:Payload =&gt; Parameter{Name {s}, Payload {valuesof(p)}};
         syntax Payload = p:(SimplePayload | ComplexPayload)? =&gt; p;
         token ComplexPayload = '&quot;' p:(^'&quot;')* '&quot;' =&gt; p;
         
         token SimplePayload = (&quot;a&quot;..&quot;z&quot;|&quot;A&quot;..&quot;Z&quot;|&quot;0&quot;..&quot;9&quot;)+;
         token Switch = (&quot;a&quot;..&quot;z&quot;|&quot;A&quot;..&quot;Z&quot;)+;
+        token tSwitchOperator = &quot;-&quot;|&quot;/&quot;|&quot;--&quot;;
         interleave Whitespace = &quot; &quot;|&quot;\t&quot;;
     }
 }
\ No newline at end of file</diff>
      <filename>LarsW.CommandlineParser/cmd.mg</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>4a32c9655f9ae755001084a9068831e7fc7f1aed</id>
    </parent>
  </parents>
  <author>
    <name>Lars Wilhelmsen</name>
    <email>lars@sral.org</email>
  </author>
  <url>http://github.com/larsw/larsw.commandlineparser/commit/9bbdbd2070240d8d408e8f70d8dcf4da79fb3088</url>
  <id>9bbdbd2070240d8d408e8f70d8dcf4da79fb3088</id>
  <committed-date>2009-03-14T05:08:48-07:00</committed-date>
  <authored-date>2009-03-14T05:08:48-07:00</authored-date>
  <message>First working version. Needs refactoring</message>
  <tree>2de97a8901012c0cb2e276805a6b573322b2ed8b</tree>
  <committer>
    <name>Lars Wilhelmsen</name>
    <email>lars@sral.org</email>
  </committer>
</commit>
