Index: orm/properties.py
===================================================================
--- orm/properties.py	(revision 2541)
+++ orm/properties.py	(working copy)
@@ -57,6 +57,14 @@
 
 mapper.ColumnProperty = ColumnProperty
 
+class StatementProperty(StrategizedProperty):
+    def __init__(self, statement, type, **kwargs):
+        self.statement = statement
+        self.type = type
+
+    def create_strategy(self):
+        return strategies.ClauseLoader(self)
+
 class PropertyLoader(StrategizedProperty):
     """Describes an object property that holds a single item or list
     of items that correspond to a related database table.
Index: orm/strategies.py
===================================================================
--- orm/strategies.py	(revision 2541)
+++ orm/strategies.py	(working copy)
@@ -37,9 +37,44 @@
             if self._should_log_debug:
                 self.logger.debug("populating %s with %s/%s" % (mapperutil.attribute_str(instance, self.key), row.__class__.__name__, self.columns[0].key))
             instance.__dict__[self.key] = row[self.columns[0]]
-        
+
 ColumnLoader.logger = logging.class_logger(ColumnLoader)
 
+class ClauseLoader(LoaderStrategy):
+    def init(self):
+        super(ClauseLoader, self).init()
+        self.statement = self.parent_property.statement
+        self.label = self.statement._label
+        self.type = self.parent_property.type
+        self._should_log_debug = logging.is_debug_enabled(self.logger)
+        
+    def setup_query(self, context, eagertable=None, **kwargs):
+        context.statement.append_column(self.statement)
+        if eagertable:
+            statement = self.statement.copy_container()
+            original_table = eagertable.original
+            aliasizer = sql_util.Aliasizer(original_table, aliases={
+                original_table: eagertable})
+            aliasizer.traverse(statement)
+        else:
+            statement = self.statement
+        context.statement.append_column(statement)
+
+    def init_class_attribute(self):
+        self.logger.info("register managed attribute %s on class %s" % (self.key, self.parent.class_.__name__))
+        coltype = self.type
+        sessionlib.attribute_manager.register_attribute(self.parent.class_,
+                self.key, uselist=False, copy_function=coltype.copy_value,
+                compare_function=coltype.compare_values, mutable_scalars=coltype.is_mutable())
+
+    def process_row(self, selectcontext, instance, row, identitykey, isnew):
+        if isnew:
+            if self._should_log_debug:
+                self.logger.debug("populating %s with %s/%s (%s)" % (mapperutil.attribute_str(instance, self.key), row.__class__.__name__, self.label, row[self.label]))
+            instance.__dict__[self.key] = row[self.label]
+
+ClauseLoader.logger = logging.class_logger(ClauseLoader)
+
 class DeferredColumnLoader(LoaderStrategy):
     """Describes an object attribute that corresponds to a table
     column, which also will *lazy load* its value from the table.
@@ -263,6 +298,7 @@
             FindColumnInColumnClause().traverse(expr)
             return len(columns) and columns[0] or None
         
+        # any use for this method?
         def col_in_collection(column, collection):
             for c in collection:
                 if column.shares_lineage(c):
