PageRenderTime 39ms CodeModel.GetById 31ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 0ms

/scalate-util/src/main/scala/org/fusesource/scalate/util/ProductReflector.scala

http://github.com/scalate/scalate
Scala | 47 lines | 19 code | 5 blank | 23 comment | 3 complexity | 134013f3d5f8c619abe33251419b1a58 MD5 | raw file
 1/**
 2 * Copyright (C) 2009-2011 the original author or authors.
 3 * See the notice.md file distributed with this work for additional
 4 * information regarding copyright ownership.
 5 *
 6 * Licensed under the Apache License, Version 2.0 (the "License");
 7 * you may not use this file except in compliance with the License.
 8 * You may obtain a copy of the License at
 9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18package org.fusesource.scalate.util
19
20/**
21 * @version $Revision : 1.1 $
22 */
23
24object ProductReflector {
25
26  /**
27   * A helper method that uses reflection to find the methods taking no arguments to be able to display the fields in a case class
28   */
29  def toMap(obj: AnyRef) = {
30    val c = obj.getClass
31    val casemethods = accessorMethods(c)
32    val values = casemethods.map(_.invoke(obj))
33    casemethods.map(_.getName).zip(values).foldLeft(Map[String, Any]())(_ + _)
34  }
35
36  def accessorMethods(c: Class[_]) = {
37    val predefined = List("copy$default$1", "copy$default$2", "curry", "curried", "$tag", "productArity", "productElements", "productIterator", "productPrefix", "hashCode", "toString", "tuple", "tupled")
38
39    c.getMethods.toList.filter {
40      n =>
41        (n.getParameterTypes.size == 0) &&
42          (n.getDeclaringClass != classOf[Object]) &&
43          !predefined.exists(_ == n.getName) &&
44          !n.getName.matches("_\\d+")
45    }
46  }
47}