Index: trunk/grails-app/services/AssetService.groovy
===================================================================
--- trunk/grails-app/services/AssetService.groovy	(revision 278)
+++ trunk/grails-app/services/AssetService.groovy	(revision 284)
@@ -2,4 +2,58 @@
 
     boolean transactional = false
+
+    def create(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["Asset", params.id] ]
+            return result
+        }
+
+        result.assetInstance = new Asset()
+        result.assetInstance.properties = params
+
+        // success
+        return result
+    }
+
+    def copy(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["Asset", params.id] ]
+            return result
+        }
+
+        result.assetToCopy = Asset.get(params.assetToCopy?.id)
+
+        if(!result.assetToCopy)
+            return fail(code: "asset.copy.asset.required")
+
+        result.assetInstance = new Asset(name: result.assetToCopy.name,
+                                                            description: result.assetToCopy.description,
+                                                            section: result.assetToCopy.section)
+
+        result.assetInstance.properties = params
+
+        // success
+        return result
+    }
+
+    def save(params) {
+        def result = [:]
+        def fail = { Map m ->
+            if(result.assetInstance && m.field) 
+                result.assetInstance.errors.rejectValue(m.field, m.code)
+            result.error = [ code: m.code, args: ["Asset", params.id] ]
+            return result
+        }
+
+        result.assetInstance = new Asset(params)
+
+        if(result.assetInstance.hasErrors() || !result.assetInstance.save(flush: true))
+            return fail(code:"default.create.failure")
+
+        // success
+        return result
+    }
 
     def saveCopy(params) {
