Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 73f1b1c70b1a01a4653725904c19b05ccdcb2a4e)
+++ src/AST/Pass.hpp	(revision 2b7f6f0640b5662ebc28adf12da366d602734a60)
@@ -67,4 +67,8 @@
 // | WithSymbolTable       - provides symbol table functionality
 // | WithForallSubstitutor - maintains links between TypeInstType and TypeDecl under mutation
+//
+// Other Special Members:
+// | result                - Either a method that takes no parameters or a field. If a method (or
+//                           callable field) get_result calls it, otherwise the value is returned.
 //-------------------------------------------------------------------------------------------------
 template< typename core_t >
@@ -89,4 +93,12 @@
 	virtual ~Pass() = default;
 
+	/// Storage for the actual pass.
+	core_t core;
+
+	/// If the core defines a result, call it if possible, otherwise return it.
+	inline auto get_result() -> decltype( __pass::get_result( core, '0' ) ) {
+		return __pass::get_result( core, '0' );
+	}
+
 	/// Construct and run a pass on a translation unit.
 	template< typename... Args >
@@ -96,5 +108,14 @@
 	}
 
-	template< typename... Args >
+	/// Contruct and run a pass on a pointer to extract a value.
+	template< typename node_type, typename... Args >
+	static auto read( node_type const * node, Args&&... args ) {
+		Pass<core_t> visitor( std::forward<Args>( args )... );
+		node_type const * temp = node->accept( visitor );
+		assert( temp == node );
+		return visitor.get_result();
+	}
+
+	// Versions of the above for older compilers.
 	static void run( std::list< ptr<Decl> > & decls ) {
 		Pass<core_t> visitor;
@@ -102,6 +123,10 @@
 	}
 
-	/// Storage for the actual pass
-	core_t core;
+	static auto read( Node const * node ) {
+		Pass<core_t> visitor;
+		Node const * temp = node->accept( visitor );
+		assert( temp == node );
+		return visitor.get_result();
+	}
 
 	/// Visit function declarations
Index: src/AST/Pass.proto.hpp
===================================================================
--- src/AST/Pass.proto.hpp	(revision 73f1b1c70b1a01a4653725904c19b05ccdcb2a4e)
+++ src/AST/Pass.proto.hpp	(revision 2b7f6f0640b5662ebc28adf12da366d602734a60)
@@ -421,4 +421,17 @@
 
 	} // namespace forall
+
+	template<typename core_t>
+	static inline auto get_result( core_t & core, char ) -> decltype( core.result() ) {
+		return core.result();
+	}
+
+	template<typename core_t>
+	static inline auto get_result( core_t & core, int ) -> decltype( core.result ) {
+		return core.result;
+	}
+
+	template<typename core_t>
+	static inline void get_result( core_t &, long ) {}
 } // namespace __pass
 } // namespace ast
