Add missing '
[gitmo/moose-dev-utils.git] / vim / moose_snippets.vim
index 5b97d8d..a7484ce 100644 (file)
@@ -5,18 +5,25 @@ if !exists('loaded_snippet') || &cp
     finish
 endif
 
-function! RemoveEmptySuperClass()
-    if @z == "SuperClass"
-        s/extends '<{}>';\n\n//e
-        return ""
+function! RemoveUnchangedLine()
+    if match(getline('.'), "<{}>") >= 0
+        normal! dd
+        return ''
+    else
+        return @z
     endif
-
-    return @z
 endfun
 
-function! RemoveEmptyLine()
-    s/^\s*<{}>\s*\n//e
-    return @z
+function! RemoveUnchangedLineSemicolon()
+    if match(getline('.'), "<{}>") >= 0
+        normal! ddkA;
+        normal! o
+        return ''
+    else
+        normal! A;
+        "normal! o " we can't actually change what line we're on :/
+        return @z
+    endif
 endfun
 
 function! Snippet(abbr, str)
@@ -38,11 +45,24 @@ function! SnippetFile(filename)
     return Snippet(abbr, str)
 endfunction
 
+function! ParameterizedModule()
+    let current_file = expand("%")
+    let t = substitute(current_file, '\.pm', '', '')
+    let t = substitute(t, 'lib/', '', '')
+
+    " Sadly, this does not work because : is a special character in snippet
+    " tag names. Any ideas?
+    "let module = substitute(t, '/', '::', 'g')
+    let module = substitute(t, '/.*', '', '')
+
+    return '<{' . module . '}>'
+endfun
+
 call Snippet('class', [
-            \"package <{ClassName}>;",
+            \"package ".ParameterizedModule().";",
             \"use Moose;",
             \"",
-            \"extends '<{SuperClass:RemoveEmptySuperClass()}>';",
+            \"extends '<{SuperClass:RemoveUnchangedLine()}>';",
             \"",
             \"<{}>",
             \"",
@@ -51,7 +71,7 @@ call Snippet('class', [
             \"",
             \"1;"])
 call Snippet('role', [
-            \"package <{RoleName}>;",
+            \"package ".ParameterizedModule().";",
             \"use Moose::Role;",
             \"",
             \"<{}>",
@@ -63,14 +83,14 @@ call Snippet('has', [
             \"has <{attr}> => (",
             \    "is  => '<{rw}>',",
             \    "isa => '<{Str}>',",
-            \    "<{options:RemoveEmptyLine()}>",
+            \    "<{options:RemoveUnchangedLine()}>",
             \");"])
 call Snippet('hasl', [
             \"has <{attr}> => (",
             \    "is         => '<{rw}>',",
             \    "isa        => '<{Str}>',",
             \    "lazy_build => 1,",
-            \    "<{options:RemoveEmptyLine()}>",
+            \    "<{options:RemoveUnchangedLine()}>",
             \");",
             \"",
             \"sub _build_<{attr}> {",
@@ -80,6 +100,7 @@ call Snippet('hasl', [
 call Snippet('sub', [
             \"sub <{name}> {",
             \    "my $self = shift;",
+            \    "my (<{arg:RemoveUnchangedLine()}>) = @_;",
             \    "<{}>",
             \"}"])
 call Snippet('around', [
@@ -98,10 +119,16 @@ call Snippet('after', [
             \    "my $self = shift;",
             \    "<{}>",
             \"};"])
+call Snippet('subtype', [
+            \"subtype '<{name}>'",
+            \    "=> as '<{supertype}>'",
+            \    "=> where { <{predicate:RemoveUnchangedLine()}> }",
+            \    "=> message { \"<{message:RemoveUnchangedLineSemicolon()}>\" }",
+            \""])
 
 " MooseX support
 call Snippet('prole', [
-            \"package <{RoleName}>;",
+            \"package ".ParameterizedModule().";",
             \"use MooseX::Role::Parameterized;",
             \"",
             \"<{}>",