diff m-toolbox/classes/@ltpda_uo/setPropertyValue.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/@ltpda_uo/setPropertyValue.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,120 @@
+% SETPROPERTYVALUE sets the value of a property of one or more objects.
+% 
+% CALL:
+%        varargout = setPropertyValue(inputs, ...
+%                                     input_names, ...
+%                                     callerIsMethod, ...
+%                                     propName, ...
+%                                     setterFcn, ...
+%                                     copy, ...
+%                                     getInfo)
+% 
+% 
+% 
+% 
+% 
+% The setterFcn should have the following signature:
+% 
+%    setterFcn(object, plist, value)
+% 
+% The plist is passed to allow the setter function to modify the plist if
+% necessary.
+% 
+% 
+function varargout = setPropertyValue(varargin)
+
+  % get inputs
+  inputs         = varargin(1:end-6);
+  input_names    = varargin{end-5};
+  callerIsMethod = varargin{end-4};
+  propName       = varargin{end-3};
+  setterFcn      = varargin{end-2};
+  doCopy         = varargin{end-1};
+  getInfo        = varargin{end};
+  
+  % Check if this is a call for parameters
+  if utils.helper.isinfocall(varargin{1:end-6})
+    varargout{1} = getInfo(varargin{3});
+    return
+  end
+  
+  % Collect inputs
+  if callerIsMethod
+    objects = inputs{1};
+    pls     = [];
+    rest    = inputs(2:end);
+    obj_invars = {};
+  else
+    [objects, obj_invars, rest] = utils.helper.collect_objects(inputs(:), '', input_names);
+    [pls, pl_invars, rest]      = utils.helper.collect_objects(rest(:), 'plist');
+    % Copy the user input plists because they may be modified in the setter
+    % functions.
+    if ~isempty(pls)
+      pls = copy(pls, 1);
+    end    
+  end
+  
+  % Process the values we want to set
+  [objects, values] = processSetterValues(objects, pls, rest, propName);
+  
+  % Decide on a deep copy or a modify
+  bs = copy(objects, doCopy);
+  
+  usedValues = cell(size(bs));
+  if isempty(setterFcn)
+    
+    if isempty(values)
+      error('Please provide a value for the property ''%s''', propName);
+    end
+    
+    for jj=1:numel(bs)
+      usedValues{jj} = defaultSetter(bs(jj), values{jj}, propName);
+    end    
+    
+  else
+    % Loop over objects and set the values by calling the setter function
+    for jj = 1:numel(bs)
+      if isempty(values)
+        if isempty(pls)
+          % here we create a plist so that the setterFcn has a plist in
+          % case it wants to modify it before it goes in the history.
+          pls = plist();
+        end
+        usedValues{jj} = setterFcn(bs(jj), pls);
+      else
+        usedValues{jj} = setterFcn(bs(jj), pls, values{jj});
+      end
+    end
+  end
+  
+
+  % Set output
+  varargout{1} = bs;  
+  if nargout > 1
+    varargout{2} = usedValues;
+  end
+  if nargout > 2
+    varargout{3} = pls;
+  end
+  if nargout > 3
+    varargout{4} = obj_invars;
+  end
+  
+end
+% END
+
+% Default setter function to set the description
+% 
+%  defaultSetter(obj, value, propertyName)
+% 
+function value = defaultSetter(varargin)
+    
+  obj      = varargin{1};
+  value    = varargin{2};
+  propName = varargin{3};
+
+  % TODO: we could check the type of value here against the default/defined value
+  
+  obj.(propName) = value;
+  
+end
\ No newline at end of file